package com.woniu.config;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;

@EnableCaching //可以开启redis的注解的使用：缓存注解是Spring的注解
@Configuration
public class RedisConfig {
    /**
     * 返回值是：注册到Spring的一个bean。
     * bean的名字是：方法名
     * 形参：RedisConnectionFactory 自动注入（DI），工厂也是一个Bean对象
     * ChangeLog : 1. 创建 (25/08/27/星期三 10:32 [马宇航]);
     * @param redisConnectionFactory
     * @return org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        //设置连接工厂，就可以直接使用yml的redis配置。就不用手动写死 redis的连接
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //用字符串序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        //value值用json序列化
        redisTemplate.setValueSerializer(RedisSerializer.json());
        //hash的序列化方案
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }
    //用于redis 缓存注解的使用配置，这个里面就不需要使用RedisTemplate
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(){
        return RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
    }
}
